package config

import (
	"errors"
	"fmt"
	"log"
	"time"

	"gitee.com/liuyun-luo/MagicStreamMovies/Server/global"
	"gitee.com/liuyun-luo/MagicStreamMovies/Server/models"
	"go.mongodb.org/mongo-driver/v2/mongo"
	"go.mongodb.org/mongo-driver/v2/mongo/options"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var MongoDb *mongo.Client

func InitMongoDB() {
	// 设置连接URI，通常指向本地或远程服务器
	clientOptions := options.Client().ApplyURI(AppConfig.MongoDB.Url)

	//链接数据库服务
	client, err := mongo.Connect(clientOptions)
	if err != nil {
		log.Fatal("数据库连接失败,err: " + err.Error())
	}
	//赋值给全局变量
	MongoDb = client
}

// 连接到具体的数据库的具体的集合
func OpenCollection(coll_name string) (*mongo.Collection, error) {
	//连接到具体的数据库的具体的集合
	coll := MongoDb.Database(AppConfig.MongoDB.Name).Collection(coll_name)
	if coll == nil {
		return nil, errors.New("集合: " + coll_name + "打开失败")
	}
	return coll, nil
}

func initMySQL() {
	dsn := fmt.Sprintf("%s:%s@tcp(%s%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", AppConfig.MySQL.User, AppConfig.MySQL.Password, AppConfig.MySQL.Host, AppConfig.MySQL.Port, AppConfig.MySQL.Name)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		DisableForeignKeyConstraintWhenMigrating: true, //关闭实体外键
	})
	if err != nil {
		log.Fatalf("数据库连接失败,err: %s", err)
		panic(err)
	}

	sqlDB, err := db.DB()
	if err != nil {
		log.Fatalf("数据库获取失败,err: %s", err)
		panic(err)
	}

	// SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。
	sqlDB.SetMaxIdleConns(AppConfig.MySQL.MaxIdleConns)

	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(AppConfig.MySQL.MaxOpenConns)

	// SetConnMaxLifetime 设置了连接可复用的最大时间。一小时
	sqlDB.SetConnMaxLifetime(time.Hour)

	//创建用户表
	db.AutoMigrate(models.User{})

	//创建电影表
	db.AutoMigrate(models.Movie{})

	//创建电影评论表
	db.AutoMigrate(models.MovieReview{})

	//创建电影类型表
	db.AutoMigrate(models.Genre{})

	//创建收藏表
	db.AutoMigrate(models.UserMovieCollect{})

	//创建简介表
	db.AutoMigrate(models.MovieSynopsis{})

	//创建电影相关的内容(AI将基于此回答用户提出的问题，以及与用户聊天)
	db.AutoMigrate(models.MovieContent{})

	//创建电影问题关键词表
	db.AutoMigrate(models.MovieQuestionKeyword{})

	//创建电影问题关键词分类表
	db.AutoMigrate(models.MovieQuestionKeywordCategory{})

	//AI使用关键字全网搜索之后，总结的结果（基于关键字形成的摘要）
	db.AutoMigrate(models.MovieQuestionKeywordSummary{})

	//设置为全局数据库
	global.MySQLDb = db
}
